// 里氏替换原则

// // 违反里氏替换原则 示例
// class Bird {
//   // 父类 Bird 假定所有鸟类都能飞行
//   fly() {
//     console.log('鸟会飞')
//   }
// }
// class Penguin extends Bird {
//   // 子类 Penguin 重新实现了 fly 方法
//   // 企鹅不会飞，这与父类行为不一致
//   fly() {
//     console.log('企鹅不会飞')
//   }
// }
// // move 函数期望一个 Bird 类型的对象，并调用它的 fly 方法
// function move(bird: Bird) {
//   bird.fly()
// }
// // 正常情况下，传入 Bird 类型的对象，调用 fly 方法可以飞
// move(new Bird())

// // 违反里氏替换原则 子类对象在替换父类对象时 必须保持父类的行为逻辑不变
// // 虽然子类也实现了 fly 但行为上子类企鹅并不会飞
// move(new Penguin) 


// 里氏替换原则 ( 子类是父类的一个特殊情况 )
// 鸟类
class Bird {
  move() {
    console.log('move 鸟类可以移动')
  }
}
// 能飞的鸟类
class FlyingBird extends Bird {
  // 里氏替换原则 子类在行为上与父类一致
  // FlyingBird 通过飞行移动，符合父类“可以移动”的行为逻辑
  move() {
    console.log('Penguin 我可以通过飞行移动')
  }
}
// 企鹅鸟类 
class Penguin extends Bird {
  // 里氏替换原则 子类在行为上与父类一致
  // Penguin 通过行走移动，虽然方式不同，但仍然符合父类“可以移动”的行为逻辑
  move() {
    console.log('Penguin 我通过行走移动')
  }
}
function move(bird: Bird) {
  bird.move()
}
move(new Bird) // 使用父类
move(new FlyingBird()) // 使用子类 子类在行为上没有破坏父类的预期行为
move(new Penguin()) // 使用子类 子类在行为上没有破坏父类的预期行为

export {} // 将当前文件变成一个模块